{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {
    "raw_mimetype": "text/restructuredtext"
   },
   "source": [
    ".. _nb_convergence:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convergence"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is fundamentally important to keep track of the convergence of an algorithm. Convergence graphs visualize the improvement over time, which is vital to evaluate how good the algorithm performance or what algorithms perform better. In pymoo different ways of tracking the performance exists. One is to store the whole algorithms run using the `save_history` flag and extract the necessary information for post-processing. Since history includes a deep copy, this can become memory intensive if many iterations are run. An alternative is to use a `Callback` object to just store the information needed and use them later on for plotting. Both ways are explained in the following for an unconstrained single-objective problem. Please bear in mind if your optimization problem has constraints or more than one objective, this needs to be addressed in the convergence curve (for instance, via plotting the `CV`, too, or using multi-objective optimization performance metrics). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## History"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Run your algorithm on the corresponding problem and make sure the `save_history` flag is enabled when calling the `minimize` function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pymoo.algorithms.so_genetic_algorithm import GA\n",
    "from pymoo.factory import get_problem\n",
    "from pymoo.optimize import minimize\n",
    "\n",
    "problem = get_problem(\"ackley\")\n",
    "algorithm = GA()\n",
    "\n",
    "res = minimize(problem,\n",
    "               algorithm,\n",
    "               termination=('n_gen', 50),\n",
    "               seed=1,\n",
    "               save_history=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This creates a deep copy of the algorithm in each generation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "50"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(res.history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This might be even more data than necessary and, therefore, not always the most memory-efficient method to use. However, if the number of generations is only a few hundred and the `problem` and `algorithm` objects do not contain a large amount of data, this shall be not a big deal. Using the history, we can extract the number of function evaluations and the optimum stored in the algorithm object at each generation/iteration. The `algorithm` object has the attribute `opt` (a `Population` object), which contains the current optimum. For single-objective algorithms, this is known to be only a **single** solution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 263,
       "width": 379
      },
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "n_evals = np.array([e.evaluator.n_eval for e in res.history])\n",
    "opt = np.array([e.opt[0].F for e in res.history])\n",
    "\n",
    "plt.title(\"Convergence\")\n",
    "plt.plot(n_evals, opt, \"--\")\n",
    "plt.yscale(\"log\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Callback"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Another way is to define a `Callback` object, which stores the information necessary to plot the convergence.\n",
    "Make sure to pass the object to the `minimize` function to get the notifications each iteration of the algorithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pymoo.algorithms.so_genetic_algorithm import GA\n",
    "from pymoo.factory import get_problem\n",
    "from pymoo.optimize import minimize\n",
    "from pymoo.model.callback import Callback\n",
    "\n",
    "class MyCallback(Callback):\n",
    "\n",
    "    def __init__(self) -> None:\n",
    "        super().__init__()\n",
    "        self.n_evals = []\n",
    "        self.opt = []\n",
    "\n",
    "    def notify(self, algorithm):\n",
    "        self.n_evals.append(algorithm.evaluator.n_eval)\n",
    "        self.opt.append(algorithm.opt[0].F)\n",
    "\n",
    "\n",
    "problem = get_problem(\"ackley\")\n",
    "algorithm = GA()\n",
    "callback = MyCallback()\n",
    "\n",
    "res = minimize(problem,\n",
    "               algorithm,\n",
    "               callback=callback,\n",
    "               termination=('n_gen', 50),\n",
    "               seed=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the `callback` object contains the information of each generation which can be used for plotting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvcAAAIPCAYAAAD3vvHPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXycZb3///dnsrbZu2TapEApdKGlUBqWYmUtLYuiCBXUAwr+QI6gIhYVFAX8oih+y6KCfj1HDypyWBUUpRQQZBdpWVpKWygt0KRN92Ta7Jnr98fcSSdpMpkkM7kzM6/n43E/7rmXa+aTQfCdK9d9XeacEwAAAIDUF/C7AAAAAACJQbgHAAAA0gThHgAAAEgThHsAAAAgTRDuAQAAgDRBuAcAAADSBOEeAAAASBOEewAAACBNEO4BAACANEG4BwAAANIE4R4AAABIE4R7AAAAIE0Q7gEAAIA0QbgHAAAA0gThHgAGyMxGmtmXzeyvZvaBmTWY2R4zW29mD5rZ+WY2wu86AQCZw5xzftcAACnHzM6U9GtJ46JO75EUllQUda5G0gXOuX8MYXkAgAxFzz0A9JOZXSjpYUWC/RpJF0ga45wrdM4VSyqVtFDSM5IqJB3vT6UAgExDzz0A9IOZHS7pX5LyJP1d0kLnXGOM+8+TNME5t3iISgQAZDB67gGgf25UJNhXS/pcrGAvSc65+yTdEn3OzPLM7Btm9i8zqzOzRjNbY2a3mNm4nt7HzC40M2dmz3jHZ5rZ02a2y8x2m9nLZvbZHtp912v3aqw6zeyz3n1bzCy7h+sfNbN7zWyjmTWb2XYze9JrZz3cf6L3fhu849PN7DHv/cNm9vVu9083s/u8641mttrMbjCzfDO73nuvu2LUf6aZPWJmm82sxXufv5rZqYn8Pru9h5nZeWb2N+9zm82s2syeNbMrzWx0L+369V0CQL8459jY2NjY4tgkVSoypt5J+tYA32OspOXeezhJTZLqo453SJrTQ7sLvevPSPqe97pd0q6otk7S17u1OzDq2pQYdf3Fu+eOHq79pNtn1EV9D07S/0oKdGtzondtg6RF3uuwpJ2S2qLrlHSKpMZu79/svX5J0k3e67t6qC1H0t091Bd9/JNEfZ9R7UskPRF1X9j7Zxf9c1yYiO+SjY2NrT8bPfcAEL8TJXX0rP5lgO/xe0lHKBJyz5VU4CLj9I+StEJSmaSHzWxML+1nSbpOkUA62jlXqsjY/we96zeZ2aiOm51z6yW97B322BNtZmWSOnq47+l27QpJ35JUK+lLkkqdcyWSCiR9RtJmb//tXuoNKhJo75Q03jlXJqmwo17v57xXUr6kVyTN9N6/UNJ/SDpU0n/28t6SdLN337uKfJ+FXvtiSZdJCkn6Voxe+H59n1H+qL2/lFwhaZRzbpSkkZKmS/qBIv+MOyXguwSAvvn92wUbGxtbqmyKDMnp6G23AbQ/Tnt7aE/t4XpQkd5fJ+kH3a5dGNX2uz20HSFpi3f9892ufdU7v7qXui72rq+P/rkUeTA4pEiAPbyXtsdqb691btT5E6PqvSfGd3KDd0+tImG3+/Vzo97nrm7XJnufvUXSfr28/2e8tisT+H2eob299afF+c9+wN8lGxsbW382eu4BIH4dY6h3OucGMhvBQm//qnPu8e4XnXO1kn7lHZ7by3s0Sbqth7aNkjre89Bul+9TZMjJVDOb3cN7dvRq39vt5zpHkR70J51zb/RUjHPuJUV+KSiTVNVLzT/t5bwkne3tf+2c29XD+98v6b1e2n5ekb+k3Oec+7CXex5UZIjPDDMb38P1gXyfn/f2jzvnlvTyud0l6rsEgJj2eWgKAJA0HcH66Rj3/EPSNZKmmFmBc25Pt+urejjXodrbl0WfdM5tMbOnJC2Q9DlFxvxLkrzAe6J32GVIjqSPePuTzWxzjJo7hq3sp8gY+WiNknoMs2aWp8gQFkl6Psb7Py9pUg/nO+r7gpl9Okb7nKj6NnW71u/vU9Icb//3GJ/ZXSK+SwDoE+EeAOK33duXmZkNoPd+rLevjnHPRm9vksYosjBWtFCMtk3ePqeHa/coEu7PM7NvRtV+niIzp610zq3o1qajp3ukt/Wlp3u2O+fCvdxfpr2ztnUP3dFqejnfUV+Rui4c1pue6hvI9xn09h/E8ZkdEvFdAkCfGJYDAPF729vnSZo6iPfJT0At/fUnRcLqBHVdVKtjSE73Xntp7/9H3O6cszi2u3p4j/aE/QS913dlnPU9k8Ra4q11MN8lAPSJcA8A8funIg9SStInBtB+q7ffP8Y9E7y9k7RtAJ/RI+dcSNKj3uFnJcnMDpJ0tPZOwdhdrbePVe9g7FTkAVJpb892T3q7luz6etPxuQcMoM1Q1wogwxDuASBOzrmN2jvO+qtmVhxPu6iFiTrGup8QY7Gik7392hhjwQeqo3d+oZnlKDKTjCS95Jzb0MP9HWO+TzSzEQmuRc65ZkmrvMOPxrj1uF7Od9R3WsKKik/H1KJn9KNNUr9LAOhAuAeA/rlWkdlXJki6x8xiDrExs3MlfcM77Jg7fYakT/Zwb1B753S/PyHVdvV3RRZpGq3I+PtYQ3Ik6QFFxvyXSfp+rDf25sofiD97+0vMrKSH9z1HPT9MK0XWDHCSDjGzS5NUX2+fK0kLzCzeXyyG4rsEAMI9APSHc+51SZcrEio/Juk1Mzs/eqEjMysxs7PN7GlFpqEs8to+J6lj6sTfmtlCM8vy2lRJWqpI+KuVdHsSam9WZOy9FFlkaYYiq8X2+IuEc267IjP3SNLVZvZfZjal47qZjTCz48zsl5JeHGBZP1dkeE5Q0mNmNsN772wz+4yk/1HkF5Ke6lsl6Vbv8E4zu8nMOoY1ycyKzGyBmd2tSLhOlMe8zSQ9ZGZfNbNS7zPNzKab2WIzOyuq1qH4LgGA2XIAoL+cc78xs+2S/p+kaZL+IElmtluR0B89c8v7ikxv2eHzioT4WYoEziYza41qs1PSp7wwmAz3SPqi9k7L+aRzbmtvNzvnfu71qP9AkcWuLjazPZJaJJVobyfRhoEU45zb6q0e+4giizitNLM6RR46zpP0gqTnJF2tyF9MuvuWIgtOfdm752ozq1fkn0Ox9q4o/MxA6uulZmdmn5P0sKQTJP1M0m1mtkuRWW46/pqzolu7pH6XACDRcw8AA+Kce1iR4SKXKzLcZaMiHSbZioSzBxWZU36qc+7ZqHZbFQmxV0l6VVKrpFxJ7yiymNIMbzGjZHlaXaed7G1ITifn3I2SDpf0a0XqDEgq8N7ncUUCdm/j4vvkLeh1pCLf2XZFQv16SddJmqdIeJd66MF3zrU75y5TZMz+3Yr8MpWnSMD+QNJfJH1FexcQSwhvwa2TJX1B0pOKrCpb5NX/T0lf9z67e7ukfpcAYANbZBEAgKFhZs8pEt4vYopIAIiNcA8AGLbM7FhFxqCHJU10zn3oc0kAMKwx5h4A4Csz+5Iiq/HeJ2mDc67dzAolna29D8zeT7AHgL7Rcw8A8JWZ3Sjpu95hu6Q6SaXa+1zY65LmO+cStqgXAKQreu4BAH67V5GHZk9QZP2AUZLqFVng6kFJv3LONfpXHgCkDnruAQAAgDTBVJgAAABAmiDcAwAAAGmCcA8AAACkCcI9AAAAkCYI9wAAAECaYCrMGMysSFKRd/iypEJJ6/2rCAAAABlgoqR659yB/W1IuI9tkaTrOg6ys7N12GGHlflYDwAAANLc22+/rcbGgS3vwTz3MXTruV8ya9asma+99pqfJQEAACDNVVVVafny5cudc1X9bUvPfQzOuZCkkCSZWWsgwCMKAAAAGL5IqwAAAECaINwDAAAAaYJwDwAAAKQJwj0AAACQJgj3AAAAQJog3AMAAABpgnAPAAAApAnCPQAAAJAmCPcAAABAmiDcAwAAAGmCcA8AAACkCcI9AAAAkCYI9wAAAECaINwDAAAAaYJwDwAAAKQJwn2KaG0Pq6Glze8yAAAAMIwR7oc555wefbNG82/5p259Yq3f5QAAAGAYI9wPc8++s01fuec1bdjeoN+9+L427mzwuyQAAAAMU4T7Ye74yWM0a79SSVJLe1i3LKX3HgAAAD0j3A9zZqZrTp/Wefzn16u1qqbex4oAAAAwXKVluDez483sL2ZWbWbOzC70u6bBOGbSaM2bVi5Jck768ZLVPlcEAACA4Sgtw72kQkkrJV0hqdHnWhLi26dPU8Air59du1UvvLvN34IAAAAw7KRluHfO/d059x3n3IOSwn7XkwhTgkVaWDWh8/jHj61WOOx8rAgAAADDjS/h3swWmtnPzew5M6v3hs7c3UebCWb2WzOrMbNmM9tgZreZWdlQ1e23K+dPUV525B/Ziuo6Pbpik88VAQAAYDjxq+f+WklfkTRLUnVfN5vZQZKWSbpI0iuSbpX0niLDbl4ys9HJK3X4GF8yQhfNPbDz+P8+vkYtbWnxhwkAAAAkgF/h/kpJUyQVS/pyHPffKalc0tecc2c55652zp2sSMifKumHSat0mPnyiQepdGSOJGnb7ma9VVPnc0UAAAAYLrL9+FDn3NMdr80s5r1er/0CSRsk3dHt8nWSviTpAjNb5Jzbk9hKh5+SETn6+rzJenfrbl0xb4rGFuX5XRIAAACGCV/CfT+d5O2XOue6jEFxzoXM7AVFwv8cSU8N9sPMbFkvl6b1cn7IXRg1NAcAAADokAqz5Uz19r0tzfqOt5/SccLMCs1slpnNUuRn3N873j+JdQIAAAC+SoWe+xJv39vg8o7zpVHnjpT0dNTxDd72O0kXxvow51xVT+e9Hv3ZfdTqmx17WjSqINfvMgAAAOCjVOi57zfn3DPOOethu9Dv2hJta6hZ1z68QnNuekrvbgn5XQ4AAAB8lArhvqNnvqSX6x3ndw1BLcPONX96U3e//IFa2sK6eckav8sBAACAj1Ih3Hck1im9XJ/s7Xsbkz9gZlZkZhVmViEpJxwefnPKXzFv79eydFWtXt2ww8dqAAAA4KdUCPcdY+cXmFmXes2sSNJcSQ2SXk7CZy9SZJGtakkza2trk/ARgzNzQok+cXhF5/FNj62Wc87HigAAAOCXYR/unXPrJC2VNFHS5d0u3yCpQNIfkjTH/WJJld62IhgMJuEjBu+bp05VTlZkvYBl7+/U0lXD75cQAAAAJJ8vs+WY2VmSzvIOx3n7Y83sLu/1NufcVVFNLpP0oqSfmdk8SW9LOkaROfDXSvpuMup0zoUkhbyaWwOB4fm70H6jRur8OQfof17YIEm6eclqzZtWruys4VkvAAAAksOv9DdL0he87VTv3KSocwujb/Z674+UdJcioX6RpIMk3S5pjnNu+5BUPYx99eTJKsqL/K62busePbBso88VAQAAYKj5Eu6dc9f3MlVlxzaxhzYfOucucs6Nd87lOucOcM593Tm3M1l1psIDtR1GFeTqP088qPP41ifWqqGlzceKAAAAMNQYtxHbsH+gNtoX5x6oYHGeJGlLqFk3/u1tnysCAADAUCLcx5YSD9R2GJGbpStP2Ts15scPG+9jNQAAABhqvjxQmypS5YHaaJ8+cj+9sXGX3qndrWMnje5yraUtrFfW79Dcg0fLzHyqEAAAAMlCuE8zWQHTTWcfpqbW9n0C/J9f26hvP7RCh00o0eUnHaz5hwQVCBDyAQAA0sXw74rGgOTnZHU5bmsP65fPrJMkvbmxTpf+YZlOv/05PfJ6tdrDLHoFAACQDgj3MaTSbDl9aWoL64QpY5WXvfcf+ZrakK6493XNW/yM7vv3B2ppS92fDwAAAIT7vqTUbDmxFOZl64ZPHqrnvn2SLj1+kgpy9/bsb9jeoG8/tEJn/vx5bapr9LFKAAAADAbhPraUmi0nHuVF+brmjEP0wtUn64p5k1Wcv/exizW1IX36Vy/p/e17fKwQAAAAA0W4j8E5F3LO1TjnaiSlxGw58Sodmasr50/RC1efrG+eOlU5WZEHazfubNRNf1/tc3UAAAAYiPRJqxiQovwcXX7Swfr1549UXnZAh4wv1k8WHuZ3WQAAABgApsKEJOmkqeX648XHaOKYApWMyPG7HAAAAAwAPffodOTEURpTmLfP+c11TT5UAwAAgP4i3MeQTlNhDtSDyzbq+J8+rSUrN/ldCgAAAPpAuI8tbabCHIgnV9XqWw++oZa2sC7743I9tGyj3yUBAAAgBsJ9bGk3FWZ/TK8o1sTRBZKksJMWPfCGfv/SBl9rAgAAQO8I9zGk81SY8agoHaH7Lj1Wh4wv7jz3/Ufe0h1Pv+tjVQAAAOhNZqVV9NvYojzde8kcHbF/aee5nz6+Rj9ZslrOOR8rAwAAQHdMhYk+lYzM0d3/3zG65Pev6sV12yVJv3xmnbbUN+uYA0fp3KP263L/llCTnnp7yz7vk5cd0PFTxvY4Iw8AAAAGj3CPuBTkZeu3Fx6lr9yzXE96wf2h5Rv11zdr9gn3H2xv0DV/WtHj+xTlZ+u6M2fonNmVMrOk1w0AAJBJGJaDuOXnZOmX51fpE4dXDPg9Qk1tuuqBN3Tx717VlnrmzwcAAEgkeu5jMLMiSUXeYUbOc99dTlZAt543SydMGat/b9ihrMC+ve9jCvP0mW69+ZL00nvb9f72BknSU6u3aP6tz+pHn5qpjx02Pul1AwAAZALCfWyLJF3XcZBp89z3JitgOqdqgs6pmtDj9YljCvTjcw7b53xDS5tuXrJGd724QZJU19iq1nZ+YQIAAEgUhuXEltHz3CfayNxsXf+JGfrfS+ZoQtkILZge1CdnDXyIDwAAALqi5z4G51xIUkiSzCzj5rlPlmMPGq0lXz9erW3hfR6qXVsb0pjCPI0qyPWpOgAAgNRFWoUvCvOyVdYtwDe1tus//7BMC279p5as3OxTZQAAAKmLcI9h4/8+vkbvbdujbbtb9J93L9PX731NW0PNampt32cLh/ddQKuptV1tjOEHAAAZjGE5GDbmTh6jv75Zo9r6ZknSw6/X6OHXa3q890+XfUSz9y/rcu7Q6x5XwEzfPHWqLjl+UtLrBQAAGG7oucewcdLUci39+gk6e3blgN+jpT2sHz32tl5ZvyOBlQEAAKQGwj2GlZKRObrl3Fn69QVVmlxeqNzsQI9bT2vbtnlDdZyTrrzvddU3tQ5t8QAAAD5jWA6GpQUzxmnBjHH9avPSNSfr1FufVX1Tm6p3Ner6v7ylW86dlaQKAQAAhh967mMwsyIzqzCzCrFC7bA3vmSEfnT2zM7jPy2v1t/e3ORjRQAAAEOLcB/bIknV3jaTFWqHv48fVqFPHbF3zP53/rxCm+uafKwIAABg6BDuY2OF2hR0wydnqLJ0hCSprrFV33zwjR6nzgQAAEg3hPsYnHMh51yNc65GEivUpoji/Bzdcu7h6lj89rl3tumuFzf4WhMAAMBQIK0iLR0zabQuPf6gzuM7nn5XDS1tPlYEAACQfMyWg7T1jflT9OzarRqZm6Vbz5ulkbn8zx0AAKQ30g7SVm52QHd98SiNLshTVqCnmfEBAADSC+Eeaa28KN/vEgAAAIYMY+6RcVZW16mukdVrAQBA+iHcI2O0h53ufOZdferOF3TdIyv9LgcAACDhCPfIGC+/t103L1mj1nanh1+v0V/eqPG7JAAAgIQi3CNjzD14jBZWTeg8vvbPK1Szq9HHigAAABKLcI+Mct2Z0zWhLLJ6bX1Tmxbdz+q1AAAgfRDuYzCzIjOrMLMKSTnhcNjvkjBIRfk5uvW8WeqYGfOl97brty+s97coAACABCHcx7ZIUrW3zaytrfW5HCTCURNH6bITD+48vnnJGm2ua/KxIgAAgMQg3Me2WFKlt60IBoM+l4NEueKUyZo2rkiS1NIe1isbdvhcEQAAwOAR7mNwzoWcczXOuRpJrYEAX1e6yMkK6CMHjek8rt7Jg7UAACD1kVaRsSpK965ey6w5AAAgHRDukbE6Zs2RpGrCPQAASAPZfhcA+OWoiaN0z8XHqLJshMaXjOi7AQAAwDBHuEfGGl2Yp48cnOd3GQAAAAnDsBwAAAAgTRDuAQAAgDRBuEfGa2pt17qtu7V9d7PfpQAAAAwKY+6R0f7Po6v0m+fXS5KuP3O6Lpx7oM8VAQAADBw998hoZSNzOl8zHSYAAEh1hHtktMqoue5rdjX5WAkAAMDgEe6R0Sqi5rffSM89AABIcYR7ZLTonvvqnYR7AACQ2gj3yGjjivOVFTBJ0rbdzWpqbfe5IgAAgIEj3COjZWcFNK44v/N4Ux3j7gEAQOoi3MdgZkVmVmFmFZJywuGw3yUhCSpK94Z7huYAAIBURriPbZGkam+bWVtb63M5SIbK0qhx97safKwEAABgcAj3sS2WVOltK4LBoM/lIBl4qBYAAKQLVqiNwTkXkhSSJDNrDQT4XSgdVZaOlCSNKcyVzHyuBgAAYOAI98h4nzqiUmfPrlR+TpbfpQAAAAwK4R4Zb0QuoR4AAKQHxpkAAAAAaYJwDwAAAKQJhuUAkmp2NWrDtj2q3tWojxw8psv0mAAAAKmCcA9I+sFfV2nJW5slST/77BGEewAAkJIYlgNIqihlrnsAAJD6CPeAui1kxSq1AAAgRRHuAanLMBx67gEAQKoi3AOSJkT13NfsavKxEgAAgIEj3APq1nO/q1HOOR+rAQAAGBjCPSCpdGSORuREVqrd3dym+sY2nysCAADoP8I9IMnMujxUu5GHagEAQAoi3AMeHqoFAACpjnAPeCq7PFRLuAcAAKmHFWoBz+TyQs2oKFZF6QiNZ4VaAACQggj3gOeiuQfqorkH+l0GAADAgDEsBwAAAEgThHsAAAAgTaRtuDezy8xsvZk1mdkyMzvO75oAAACAZErLMfdmdp6k2yVdJul5b/+YmU13zn3ga3EY1h5/a7PWbg6pelejvjZvsip4sBYAAKSQtAz3kr4h6S7n3H95x181s9MkfVnSNf6VheHuN8+t1ysbdkiSPnbYeMI9AABIKb4MyzGzhWb2czN7zszqzcyZ2d19tJlgZr81sxozazazDWZ2m5mVdbsvV1KVpKXd3mKppI8k9idBuome656FrAAAQKrxq+f+WkmHS9otaaOkabFuNrODJL0oqVzSI5JWSzpa0hWSTjOzuc657d7tYyRlSart9ja1kk5J1A+A9NRllVoWsgIAACnGrwdqr5Q0RVKxIkNl+nKnIsH+a865s5xzVzvnTpZ0q6Spkn6YtEqRUbr03BPuAQBAivEl3DvnnnbOveOcc33d6/XaL5C0QdId3S5fJ2mPpAvMrMA7t01Su6Rgt3uDkjYPpm6kv+gx9gzLAQAAqSYVHqg9ydsvdc6Foy8450Jm9oIi4X+OpKeccy1mtkzSfEkPRN0+X9JDfX2Y17YnMYcOIT0wLAcAAKSyVJjnfqq3X9vL9Xe8/ZSoc7dIutDMLjazQ8zsdkkVkn6VpBqRJqLD/ea6JrWH+/zjEgAAwLCRCj33Jd6+rpfrHedLO0445+4zs9GKPLg7XtJKSWc4597v68Occ1U9nfd69GfHWzRS04jcLI0uyNX2PS1qCzttCTVpfAnTYQIAgNSQCj33A+Kcu9M5N9E5l+ecq3LOPet3TUgNjLsHAACpKhXCfUfPfEkv1zvO7xqCWpABGHcPAABSVSoMy1nj7af0cn2yt+9tTP6AmVmRpCLvMCccDse6HWnipGljVV6cp8rSEZpRUex3OQAAAHFLhXD/tLdfYGaB6BlzvPA9V1KDpJeT8NmLFJluU5JUW9t9XSyko/OO2t/vEgAAAAZk2A/Lcc6tk7RU0kRJl3e7fIOkAkl/cM7tScLHL5ZU6W0rgsHuU+cDAAAAw4cvPfdmdpaks7zDcd7+WDO7y3u9zTl3VVSTyyS9KOlnZjZP0tuSjlFkDvy1kr6bjDqdcyFJIa/m1kBg2P8uBAAAgAzm17CcWZK+0O3cJG+TpPcldYZ759w6MztS0g8knSbpDEmbJN0u6Qbn3M6kVwwAAAAMc76Ee+fc9ZKu72ebDyVdlIx6esMDtZnrh39bpXe27Fb1zkbdf+mxKivI9bskAACAPqXCA7V+4oHaDPXMmq16Z8tuSZHpMAn3AAAgFTCIPDYeqM1QlWXMdQ8AAFIPPfcx8EBt5mKVWgAAkIpIq0APWKUWAACkIsI90IMJZfTcAwCA1MOwnBiYLSdzRffc19QR7gEAQGqg5z62RZKqvW0ms+VkDsbcAwCAVES4j43ZcjJUsDhf2QGTJG3f06LGlnafKwIAAOgb4T4G51zIOVfjnKuRxGw5GSQrYBpXkt95zEO1AAAgFZBWgV50GXdPuAcAACmAB2qBXlxy3CR97pj9VVE6QtPGFfXdAAAAwGeEe6AXp0znGQsAAJBaCPcxMBUmAAAAUglj7mNjKkwAAACkDMJ9bEyFCUnSnuY2v0sAAADoE8NyYnDOhSSFJMnMmAozw7S1h3XmL15Q9c4G7Wlp19obT1eWN/c9AADAcERaBXqRnRXQ1lCT6pva1B52qq1v8rskAACAmAj3QAzRc92zkBUAABjuCPdADJVlUeF+J+EeAAAMb4R7IAZ67gEAQCrhgdoYmOceFYR7AACQQui5j4157jNcl557huUAAIBhjnAfG/PcZ7guY+7puQcAAMMcw3JiYJ57TCgd2fm6ZlejnHMyY657AAAwPJFWgRiKR2SrIDdLktTQ0q5dDa0+VwQAANA7wj0Qg5l1Ds0JmLSZhawAAMAwxrAcoA8/++wRKsjN1riSfOVk8fswAAAYvgj3QB+mjSv2uwQAAIC40A0JAAAApAnCPQAAAJAmGJYTAyvUokNDS5tqdjWqrrFVVQeM8rscAACAHhHuY1sk6bqOA1aozUy19U065kdPSZJGFeRq+ffm+1wRAABAzxiWExsr1EJjCvOUHYgsXLVjT4saWtp8rggAAKBnhPsYnHMh51yNc65GEivUZqisgGl8aX7ncc2uRh+rAQAA6B1pFYhDRcmIztfVu1jICgAADE+EeyAOHavUSlL1TnruAQDA8ES4B+IwoTS6577Bx0oAAAB6R7gH4kDPPQAASAWEeyAOlaUjO1/XMOYeAAAMU4R7IA4VUbPlVDNbDgAAGKYI90AcKqLG3G+ub8d1nBQAACAASURBVFJbO6sVAwCA4YcVaoE45OdkqbwoT05SZekIhZraVFaQ63dZAAAAXRDugTi9cPXJysnij10AAGD4ItzHYGZFkoq8w5xwmKEYmYxgDwAAhjvSSmyLJFV728za2lqfywEAAAB6R899bIsl/dp7vSQYDM70sxgMD1+5Z7mef3dbXPd+72PTdU7VhC7nzvt/L2lNbSiu9j/7zBE6fsrYLufmLX5G2/e0xNX+fy+Zo0PGF3ceh8NOs298Iq62kvTElSdobFFe5/GW+iYtuO3ZuNqapNe+v6DLuZXVdTr/N/+Kq/3Ywjw98Y0Tupx7evUWXXn/63G1n1FRrD9ePKfLuftf/VD3//tD3Xn+bJUX5ffSEgCA1EW4j8E5F5IUkiQzaw0E+EMHpD3NbdrV0BrXvS09zKoTaoq/fVsPQ8HqGuNv3x52+5yLt60kOXVtH3bxtzfruZ542+dl7/vvW2t7OO72oaa2fc61tIX16vs7defT63T9J2bE9T4AAKQS0iqAjLCyuk6Pv7VZkrT0rc1ybt9ffAAASHXG/8HFx8yWzZ49e/ayZcv8LgU+CzW1qq09vn9vRuRmKT8nq8u5usZWhXvoUe9JQV62crv1YO9qaFG8/9oW5WcrO+pBYOfi7zmXpJIROQoE9nbBt4ed6hvjb999utC29nCPPeo9CZipZGROl3MtbWHtaY6zfcBUMmJv+9b2sGZe/7iaWiN/DXn0qx/VoZUlcb0XAABDqaqqSsuXL1/unKvqb1uG5QD9VJSf0/dNMUQHzoEoHTnw+fXNbFDz82cFBtc+OyswqPa52QHlZg+sfU5WQKcfOl5/fq1akrR0VS3hHgCQdhiWAyBjzJ8e7Hy91BuiAwBAOiHcA8gYx08Z2znMafXmkD7c0eBzRQAAJBbhHkDGKMzL1kcPHtN5vHQVa1cAANIL4R5ARokemvPEKobmAADSC+EeQEaZd0h55xz8r6zfoZ1xLggGAEAqINwDyCjlRfk6Yr9SSZFFuZ5avcXnigAASBzCPYCMs2DGOBXkZuljM8drv7IRfpcDAEDCMM89gIxz/pwDdOFHJu6zwBgAAKmOcA8g4xTm8Z8+AEB6YlgOAAAAkCYI9wAyXlt7WOGw87sMAAAGjXAfg5kVmVmFmVVIygmHw36XBCCBnntnq6564A0d9cMn9er7O/0uBwCAQSPcx7ZIUrW3zaytZTVLIJ08tnKzHly2UTsbWlnQCgCQFgj3sS2WVOltK4LBYB+3A0glC6JWq126qlbOMTQHAJDaCPcxOOdCzrka51yNpNZAgK8LSCfHHjS6c+ac97c36J0tu32uCACAwSGtAshYedlZOmHq2M7jpW8xNAcAkNoI9wAyWvehOQAApDLCPYCMduLUcmUHTJL05sY6bapr9LkiAAAGjnAPIKOVjMjRsQeN7jx+kt57AEAKI9wDyHjzGZoDAEgThHsAGe+UQ/aG+5fWbVddY6uP1QAAMHCEewAZr6J0hGZWlshMOmL/Um0NNftdEgAAA5LtdwEAMBz85JzDVF6cpzGFeX6XAgDAgBHuAUDS9Ipiv0sAAGDQGJYDAAAApAnCPQAAAJAmGJYDAJ5w2OmNjbv0xKpaLf9gp+65eI4C3gJXAACkAsI9AHjCzumLd/1bOxsiU2G+sXGXjti/zOeqAACIH8NyAMCTnRXQvKg5759gQSsAQIoh3ANAlAWsVgsASGGEewCIctzkscrPifyn8d0tu/Xe1t0+VwQAQPwI9wAQZURulo6bPLbzmKE5AIBUQrgHgG6ih+YQ7gEAqYRwDwDdzDskqI4ZMJd9sFNbQ83+FgQAQJwI9wDQzaiCXB05cZQkyTnpH6vpvQcApIa0nOfezI6XdJWkKkkVki5yzt3la1EAUsqC6UG9sn6HJGn15lCXa9W7GnXCzU/H9T6BgGntjad3Off6h7u08JcvxtV+fGm+nvvWyV3OPf7WZl3+x+VxtT9sQon+dNncLufufvl9Xf+Xt+JqP396UL88v6rLuVuWrtGdz6zb594ZlSX6zReO1JjCvLjeGwCQeOnac18oaaWkKyQ1+lwLgBS0YPq4zteXnXjwPtfbwi6urT3s9mnrXHxt28JO7e09te/H5+/bvH+f30P94V4+/40Pd+mBVzf285sGACRSWoZ759zfnXPfcc49KCnsdz0AUs/+o0fqS8dPUk6WyczvalLHxp0NfpcAABnNnOuhW6e/b2K2UNIJkmZJOlxSkaQ/OufOj9FmgqQfSDpN0mhJmyQ9LOkG59zOQRe193N2S/rKYIflmNmy2bNnz162bFliCgOQEtrDTgGTLCrhd/R8xysnq2s/Sjjs1N6P//YOpr0psvJutPawUziB7Ze+VavL74kMEzrlkHL99xeOiuu9AQA9q6qq0vLly5c756r6vrurRI25v1aRUL9b0kZJ02LdbGYHSXpRUrmkRyStlnS0IsNoTjOzuc657QmqDQAGLCuwb7e9mSkna+Dd+YGAKSD/2mcFTFkJbD++NL/zdW09MwsBgJ8SNSznSklTJBVL+nIc99+pSLD/mnPuLOfc1c65kyXdKmmqpB9G32xmN5qZ62M7MUE/CwCgH4LF0eG+ycdKAAAJ6bl3znVOG2F9DE71eu0XSNog6Y5ul6+T9CVJF5jZIufcHu/8bZLu7qOMD/pRMgAgQcZGzY6zq6FV7WHX4188AADJ58dUmCd5+6XOuS4PuzrnQmb2giLhf46kp7zz2yRtG4rizKy3QfUxhxoBQKbKzQ7ob1/7qMYW5Wl0QR7BHgB85MdsOVO9/dperr/j7acM9APMrNDMZpnZLEV+xv294/0H+p4AgN7NqChReVE+wR4AfOZHz32Jt6/r5XrH+dJBfMaRkqJXmLnB234n6cJYDXt7Ktnr0Z89iJoAAACApErLFWqdc89Ig5gKAgAAAEhBfoT7jp75kl6ud5zfNQS1xGRmRYrM2S9JOeEw62EBQE/CYaedDS3aXN+kETlZmjS20O+SACAj+THmfo23721M/WRv39uY/KG0SFK1t82sra31uRwAGJ7+998fqOrGJ/Wxnz2vX/1znd/lAEDG8iPcd4yFX2BmXT7f6ymfK6lB0stDXVgPFkuq9LYVwWDQ53IAYHgKFu2d634zC1kBgG+GPNw759ZJWippoqTLu12+QVKBpD9EzXHvG+dcyDlX45yrkdQaCPjxuxAADH/jSvaG+y0sZAUAvknImHszO0vSWd7hOG9/rJnd5b3e5py7KqrJZZJelPQzM5sn6W1JxygyB/5aSd9NRF0AgKFRXrx3IStWqQUA/yTqgdpZkr7Q7dwkb5Ok9yV1hnvn3DozO1LSDySdJukMSZsk3S7pBufczgTVBQAYAh2LV7WHnXY2tKq5rV152Vl+lwUAGSch4d45d72k6/vZ5kNJFyXi85OF2XIAID5ZAdPYwjxt9nrtt9Q3a79RI32uCgAyD4PIY2O2HACIUzBq3D1DcwDAH4T72JgtBwDiFCyKHnfPjDkA4Ie0XKE2UZxzIUkhSTIzZssBgBiCxfTcA4DfSKsAgIQIMmMOAPiOnnsAQEIEi/OVmxVQeXGe8nOYKQcA/EC4j4HZcgAgfp86olILqybIzPwuBQAyFsNyYmO2HACIU3ZWgGAPAD4j3MfGbDkAAABIGQzLiYHZcgAAAJBKCPcAgIRZvbleH+5oVG19k047dJzGFOb13QgAkDCEewBAwnzv4ZX694adkqRJYwsI9wAwxAj3MTBbDgD0T3nUQlZbWKUWAIYcg8hjY7YcAOiHYBGr1AKAnwj3sTFbDgD0Q/QqtZsJ9wAw5BiWEwOz5QBA/4wrYVgOAPiJtAoASJhyhuUAgK8I9wCAhIkellMbItwDwFAj3AMAEiZ6tpza+mY553ysBgAyD+EeAJAwhXnZKsyLPM7V0hZWXWOrzxUBQGYh3MdgZkVmVmFmFWKeewCISzkz5gCAb5gtJ7ZFkq7rOGCeewDo26z9SjW2ME/B4nzlZNGHBABDiXAf22JJv/ZeLwkGgzP9LAYAUsEt587yuwQAyFiE+xiY5x4AAACphLQKAAAApAnCPQAAAJAmGJYDAEioXQ0tevi1atWGmpWTFdA35k/xuyQAyBiEewBAQu1ubtP1f10lKbJiLeEeAIYOw3IAAAk1tmjvPPdbQ81qD7NKLQAMFcI9ACCh8rKzNKogV5IUdtL23c0+VwQAmYNwHwMr1ALAwJRH9d7X1hPuAWCoEO5jWySp2ttmskItAMQnWJzf+XpzfZOPlQBAZiHcx7ZYUqW3rQgGgz6XAwCpYVxUuK8l3APAkGG2nBhYoRYABiZYvHdYzhbCPQAMGdIqACDhyrv03DPmHgCGCuEeAJBw0WPua0P03APAUCHcAwASLnpYDj33ADB0GHMPAEi4ytIROnt2pYLF+Zo4eqTf5QBAxiDcAwASbnRhnm45d5bfZQBAxmFYDgAAAJAmCPcAAABAmiDcAwAAAGmCMfcAgKRYsnKT/r5is2rrm3TeUfvp7NkT/C4JANIe4T4GMyuSVOQd5oTDYT/LAYCUsrZ2t/7yRo0k6Yj9y3yuBgAyA8NyYlskqdrbZtbW1vpcDgCkjnFRC1ltqWchKwAYCoT72BZLqvS2FcFg0OdyACB1lEcvZMUqtQAwJBiWE4NzLiQpJElm1hoI8LsQAMQrGNVzv7mOcA8AQ4G0CgBIimCXYTnNPlYCAJmDcA8ASIqykTnKzYr830youU17mtt8rggA0h/hHgCQFGbWZdz9lhC99wCQbIR7AEDSMO4eAIYW4R4AkDRdpsNkxhwASDrCPQAgabpMh8lc9wCQdEyFCQBImtMPHa9JYwsVLMrT9Ipiv8sBgLRHuAcAJM3RB47S0QeO8rsMAMgYDMsBAAAA0gThHgAAAEgThHsAwJBwzsk553cZAJDWGHMPAEiqz//2Fa3ftlu19c3693dOUcnIHL9LAoC0Rc89ACCpNu5o0Ic7GtXSFlYtc90DQFIR7gEASRU91z2r1AJAcjEsJwYzK5JU5B3mhMNhP8sBgJQUvUotC1kBQHLRcx/bIknV3jaztrbW53IAIPUEo8L9llCzj5UAQPoj3Me2WFKlt60IBoM+lwMAqaecnnsAGDIMy4nBOReSFJIkM2sNBPhdCAD6Kxg15p5wDwDJRVoFACRVsEvPPcNyACCZCPcAgKQKFjEsBwCGCuEeAJBU0VNhbgk1KxxmlVoASBbCPQAgqfJzslTqrUrbHnbavqfF54oAIH3xQC0AIOl+dX6VCvOyNa4kX6NG5vpdDgCkLcI9ACDp5kwa7XcJAJARGJYDAAAApAnCPQAAAJAmCPcAgCERDjttDTWrZlej36UAQNpizD0AIOmeXrNFl/zuVbWFnU6eVq7fXniU3yUBQFqi5x4AkHRlI3PV5s1vz0JWAJA8hHsAQNIFoxayItwDQPIQ7gEASTe2ME9mkdfbdreotT3sb0EAkKYI9wCApMvOCmhM4d7e+62hZh+rAYD0RbgHAAwJhuYAQPIR7gEAQyJYlN/5mnAPAMlBuAcADIlgSXS4Z1gOACQD4R4AMCTouQeA5CPcAwCGRNcx9/TcA0AyEO4BAEMiWBzpuc/NDijsnM/VAEB6yva7gGQxs2sknS1pqqRmSS9LusY5t9LXwgAgQx170Gi9/v35KhmRI+uY9B4AkFDp3HN/oqQ7JX1E0smS2iQ9aWaj/CwKADJVfk6WSkfmEuwBIInStufeOXdq9LGZXSCpTtJcSX/1pSgAAAAgiRLWc29mC83s52b2nJnVm5kzs7v7aDPBzH5rZjVm1mxmG8zsNjMrS1RdUYoU+Xl3JuG9AQAAAN8lsuf+WkmHS9otaaOkabFuNrODJL0oqVzSI5JWSzpa0hWSTjOzuc657Qms73ZJr0t6KYHvCQDoh62hZlXvalRtfZMOn1CqcVFz3wMABi+RY+6vlDRFUrGkL8dx/52KBPuvOefOcs5d7Zw7WdKtijwE+8Pom83sRu+vAbG2E3v6IDO7RdJHJZ3jnGsf+I8IABiM7z+yUmfd8YIu/cMyvbJhh9/lAEDaSVjPvXPu6Y7XfT0s5fXaL5C0QdId3S5fJ+lLki4ws0XOuT3e+dskxRzmI+mDHj7rVkmfkXSSc+69PtoDAJKoYzpMSdrCQlYAkHB+PVB7krdf6pwLR19wzoXM7AVFwv8cSU9557dJ2tafDzGz2yWdp0iwXx1nm2W9XIo5zAgA0LfyLgtZEe4BINH8mgpzqrdf28v1d7z9lIF+gJndIekiSZ+TtNPMxnlb4UDfEwAwOMGivT33rFILAInnV899ibev6+V6x/nSQXzGZd7+qW7nb5B0fW+NnHNVPZ33evRnD6IeAMh40cNy6LkHgMRL53nuWSUFAIaZIMNyACCp/BqW09EzX9LL9Y7zu4agFgDAEAmWdB2W45zzsRoASD9+9dyv8fa9jamf7O17G5M/JMysSJHFryQpJxwOx7odANCHorxsjcjJUmNruxpb2xVqblNxfo7fZQFA2vCr575j2swFZtalBi9Qz5XUIOnloS6sm0WSqr1tZm1trc/lAEBqM7MuQ3OYDhMAEsuXcO+cWydpqaSJki7vdvkGSQWS/hA1x71fFkuq9LYVwWDQ53IAIPWVFzNjDgAkS8KG5ZjZWZLO8g7Heftjzewu7/U259xVUU0uk/SipJ+Z2TxJb0s6RpE58NdK+m6iahso51xIUkiSzKw1EPDrDx0AkD4OHF2gbaFmlRfnKSeL/64CQCIlcsz9LElf6HZukrdJ0vuSOsO9c26dmR0p6QeSTpN0hqRNkm6XdINzbmcCawMADBM/WXiY3yUAQNpKWLh3zl2vGPPH99LmQ0UWmhqWeKAWAAAAqYS/h8bGA7UAAABIGWm7iFWCLJb0a+/1kmAwONPPYgAgnby7JaRf/ONdxTPT/VdPnqyDywu7nLvqgTfU2h7fX1Sv/dh0jS3aO0tPQ0ubrvnTirhrvXnhYcrLzuo83lTXqB8/tlqSVFk6QhfOnajyovzemgPAkCHcx8ADtQCQeM1t7Xrq7S2qrW/Sm9V1em9r3xOj/ccxB+xz7tE3a9TUGl+4/8b8KZL2hvvWdqdHXq+Ju+Yfn931OYHdTW1d2v/xXx/oujOn61NHVMqMBdIB+IdwDwAYUjmBgG57cq3W1u72u5SEqWts1Tfuf0OPvrlJP/rUTI0roRcfgD8I9wCAIRUImP502Vw9t3armtvi63mfNLZgn3M3Lzxc4XA8g3qk0YV5XY5H5GTptvNmxdVWknKyuvbGB0vyddt5s9TQ0q47n3lXG3c2SpL+sXqL5t/yT1378UN07pH70YsPYMiZc/H9hzETdZstZ8msWbNmvvbaa36WBAAYZvY0t+nmJav1u5fe73L+uMljdNPZMzWhbKRPlQFIVVVVVVq+fPly51xVf9syiDw2ZssBAMRUkJetGz55qO770hxNHL03yD/3zjadeuuzqq1v8rE6AJmGcB/bYkmV3rYiGAz6XA4AYLg6ZtJoPXbF8br4oweqYzTO6TPHK1jM+HsAQ4cx9zEwWw4AoD9G5Gbp2o9P1+kzx2vx0jX63sem+10SgAxDuAcAIMGqDijTPZfM2ed8fVOrrrz3dR2xf6lysmJ3GJ0wdaymjSvucu6BVz/Ujj0tcdVwxszx2m9U1/H+v3txg5pa2/e510yaPr5Ecw8ezUPAQIoj3AMAMER++Ojbemr1Fj21ekuf95aNzN0n3P/m+fVavTkU12dNHVe0T7i//al3Yv5yMLm8UBcfd6A+OatS+TlZvd4HYPhinAkAAEPgwx0Nemj5Rr/LiOmdLbv17YdW6KM/+YdWVtf5XQ6AAaDnPoZuU2HmhMPxzccMAEB3+40aqb997Tj9bcWmHofGdDdlXNE+586ZPUFbdzfH9Xk9TcF5wZwD1NjDZ9c1tOrRN2u0pyVyzTnp4PLCuD4HwPDCPPcxmNn1kq7rOB4/frxqauJfrhwAgFRR19iqe1/5QP/zwgZ95uj99PVTpnS5/vameu1pblPVAWWMyweSbDDz3NNzH9tiSb/2Xi8JBoMz/SwGAIBkKRmRo0tPOEgXzT1QbT38pXrx0rV68u1aHbF/qS45bpJOnTFOWQFCPjDcEO5jYCpMAECmyc0OKLfbI3nvbd2tp1ZHFnJ87YNduuyPyxUsztPE0QUaU5SnsYV5GlOYq7FFeSovytdJ08r9KB2ACPcAAKAPudkBfbpqgh5+rUYt7ZFe/dr6ZtXW7zv+f1RBrpZ/b36Xc8ve36kfP/a2crP77iQ7tLJE15x+SJdzj7xerftf/TCuWj968Fh9+cSDupz73YsbtHTV5rjan3lYhT5z9P5dzt325Fr9e8MOSVJRXo6+Ou9gzagoiev9gKFGuAcAADFNKBupmxcerqtOnarfv/i+7v7X+9rV0NrjvWML8/Y59+GOBv17w864PivQw3j+jTsb9cK72+Nq39OKwO9t3R13+8MmlO5zbs3mUJf2K2vq9NSiE5SXzXShGH4I9wAAIC7lRfm66tSp+uq8g7V+2x5tC7Vo2+5mbdvdrK27m7Ut1KLy4n3D/dZQfDP8pIqNOxv1+xff1yXHT/K7FGAfhHsAANAvedlZkQW2xsV3/ydnVWhGZbHimVG6dGTOPuc+cXiFDu+hR70nPf1yccGxEzV/enzFTigbsc+5r82brP845gC9sG6bfvnMOknSz//xjj595ASVjsyN632BoUK4j4F57gEAGLzy4nyV9zBcJl77jRq5z2q7/XFweeGg5u0/ZHxkpeCjDxylx1Zs0obtDapvatMv/vGurv349AG/L5AMTP8S2yJJ1d42s7a21udyAACAX3KzA/r2adM6j3//0vv6YHuDjxUB+yLcx7ZYUqW3rQgGgz6XAwAA/HTaoeNUdUCZJKmlPaybH1/tc0VAV4T7GJxzIedcjXOuRhLz3AMAkOHMTN85Y+9UnY++uUmvf7jLx4qArkirAAAA/VB1QJnOmBl5QPfEqWNVlM8jjBg++F8jAABAP1192iH63NEH6KOTx/hdCtAF4R4AAKCf9h89UvuPHvgMPkCyMCwHAAAASBOEewAAgEFqam3Xfz/3nkJNrX6XggzHsBwAAIBBWPrWZl3/l7dUU9eknQ0t+uap0/puBCQJPfcxmFmRmVWYWYVYoRYAAPSgoaVdNXVNkqT/fm69NtU1+lwRMhnhPjZWqAUAADF94vAKHVpZLElqbgtr8dK1PleETEa4j40VagEAQEyBQNeFrR5avlGraup9rAiZjHAfAyvUAgCAeHzkoDE6eVq5JMk56abH3va5ImQq0ioAAEACXHP6NAUs8vq5d7bpn2u3+lsQMhLhHgAAIAEmB4t03lH7dx7/6G9vqz3sfKwImYhwDwAAkCBXzp+skblZkqQ1tSE9tGyjzxUh0xDuAQAAEqS8KF+XHn9Q5/HiJ9aooaXNx4qQaQj3AAAACXTJ8QeqvChPRfnZ+uLcA5XVMRAfGAKsUAsAAJBAI3Oz9cvzqzRpTIHKCnL9LgcZhp57AACABKs6oGyfYO+c07qtu32qCJmCcA8AADAEHli2UQtufVY//Nsq7WlmHD6Sg3Afg5kVmVmFmVVIygmHw36XBAAAUtCOPS266e+RqTH/67n1WnDrs3pyVa3fZSENEe5jWySp2ttm1tbyLyEAAOi/hpY2TQkWdR5X72rUxb9/VZf+4VVtqmv0sTKkG8J9bIslVXrbimAw6HM5AAAgFU0oG6l7vzRHP114mMpG5nSef/ytWp2y+J/6zfPr1dbOCAEMHuE+BudcyDlX45yrkdQaCPB1AQCAgTEzffrI/fTUohP16aoJnef3tLTr/zy6Sp+84wW9uXGXjxUiHZBWAQAAhtCoglz99NOH674vzdHB5YWd59+qqdcn73hBj75Z42N1SHWEewAAAB8cM2m0/v6143TVginKy45EsjGFeTpu8lifK0MqYxErAAAAn+RmB/SVkyfrzMMrdO3DK/XpI/dTyYicvhsCvSDcAwAA+OyA0QX6/ReP9rsMpAGG5QAAAAwDZiYz63Ju/bY9eo9VbdEPhHsAAIBh6B+ra/WJXzyvS37/qkJNrX6XgxRBuAcAABhmduxp0VfueU2hpjat27pH37j/DYXDzu+ykAII9wAAAMPMqIJc3XT2zM7jJ1bV6hdPv+tjRf9/e3cfZFd5F3D8+9vdZJNASENwiA1oIFSJVEcS1JKUtlQHrAODbfnDOlJeZDo4QwsMdOxgFRyHmloQOkCn1haZFscqOO2MGigW+gJBCg0grU0LAYIgEEhStnnZvOzu4x/nWbi5uXdzdze7d+9zv5+ZZ86e55zn3mfP75y7v3v2nOeoU5jcS5IkzUDn/PoSLn7ncW/M3/jNp7hvw+Y29kidwORekiRphvrE+05k1bJFAKQEl3/1CW+w1ZhM7iVJkmaovt4ebvnDFSx5y1wAtu8Z4iNfWe8NtmrK5F6SJGkGO/Kw2fzdeSvfeIrtxld3cKU32KoJk3tJkqQZ7u1LFrDmg2/eYHvvjzZzqzfYqgGTe0mSpA7w/pOP4aLVb95gu2vfcBt7o5mqr90dmMkiYj4wP8/OGhkZaWd3JElSl7v6907k+a07ef+KJZz1a29td3c0A5ncj+1K4JrRmc2bHX5KkiS1T19vD188/xQiot1d0Qxlcj+2G4Av5J/vOfroo391rJUlSZKmWn1iv2PPEO/41H0tt3/46t/m8P43U8BNW3Zy1s0PttR23uxeHvmz39mv7pHntnHR7Y+21P4XjpzH2stO26/u3598iU/86w9aan/K0oXcfuFv7ld3+7rnuP7ep1pqf8zCudx92WlFfzkyuR9DSmk7sB0gIvb19HiLgiRJmnl27BmacNuRlFpun9KBI/QMj7TefrDBfQLjar/3wPb7hltv/4uL5h2Q2D/xwuu8MjDIqccfxYJ5s1p6nZnM5F6SJEldYfUJRx1Qd8fDEaZ0wQAACm9JREFUz3PX+hfpiWpUotUnHMXqZUdxytKFzJnV24ZeTk40+gamA0XE+hUrVqxYv359u7siSZL0hjSOM+8Ah/f37Xf2engksWtv6+3nz9n/7PbQ8EjDM/KN9ERwWP/+55b3DY+wu8X2vT3BvNn7t98zNMzeoYMPepKA2b09+yXsKSVWrbmflwd2H7D+7L4ezjxpMTd/6OSW+nYorVy5kscee+yxlNLK8bb1zL0kSVIHi4gDEu7x6O2ZXPu+3h7m90780uVZvT3MmkT7/r5e+vsmdoZ97/AIH1ixhHUbt/Lki69T+1ywvUMjdOKV+Sb3kiRJ6kr9fb18/MwT+fiZMDC4j+89u5V1G7fw4MYtPPPaTlafsKjdXRw3k3tJkiR1vQVzZ3HGSYs546TFALwysJt5/Z13zb3JvSRJklRn8YI57e7ChDi2oyRJklQIk3tJkiSpECb3kiRJUiFM7iVJkqRCmNxLkiRJhTC5lyRJkgphci9JkiQVwuRekiRJKoTJvSRJklQIk3tJkiSpECb3kiRJUiFM7iVJkqRCmNxLkiRJhTC5lyRJkgphci9JkiQVwuRekiRJKkSklNrdh44QEVvnzp175PLly9vdFUmSJBVsw4YNDA4ObkspLRpvW5P7FkXEc8ARwKZJvtSJefrjSb6OOocx7y7Gu7sY7+5ivLtPu2K+FPhZSum48TY0uZ9mEbEeIKW0st190fQw5t3FeHcX491djHf36cSYe829JEmSVAiTe0mSJKkQJveSJElSIUzuJUmSpEKY3EuSJEmFcLQcSZIkqRCeuZckSZIKYXIvSZIkFcLkXpIkSSqEyb0kSZJUCJN7SZIkqRAm95IkSVIhTO4lSZKkQpjcT5OIOCYibouIlyJiT0RsioibImJhu/smiIhzI+LmiHggIn4WESki7jhIm1URsTYitkXEYEQ8GRGXR0TvGG3OiohvR8RAROyIiO9FxPkHeZ/zI+KRvP5Abn/WRH9XQUQsioiLI+JrEbExx28gIh6MiD+OiIafjca8c0XEpyPivoh4IcduW0Q8HhHXRMSiJm2Md0Ei4o/yZ3uKiIubrDPl8YuI3oi4Iu9Po/vi2ohYNdnfsVvlnCo1Ka80aVPu8Z1SskxxAZYBm4EEfB1YA9yf538MLGp3H7u9AE/keGwHNuSf7xhj/XOAIWAH8CXgMzmWCbizSZtL8/ItwK3AjcALue76Jm2uz8tfyOvfCmzNdZe2e7t1agEuydvwJeAfgb8GbgNez/V3kR/yZ8zLKMBe4OEc5zXAzcCjebv+H3Cs8S63AMfm43t73rYXtyN+QAB38ubf/8/k/WtH3t/Oafe26sQCbMrxvbZBuarB+kUf320PSDcU4Bs5kB+tq//bXP/5dvex2wtwOvC2/MH7HsZI7oEjgFeBPcApNfVzgIdy2z+oa7MU2J0P6qU19QuBjbnNqXVtVuX6jcDCutfaml9v6WR+724twHuBs4GeuvrFwP/m7f5BY15OAeY0qb8ub/PPGe8yS/5c/ybwDFUSd0ByP13xAz6U26yr3SeB38j726vA/HZvs04rVMn9phbXLf749rKcKRYRy4AzqHa8W+sWXwPsBM6LiMOmuWuqkVL6Vkrp6ZSPvIM4F/g54Ksppe/XvMZu4JN59k/q2lwE9AO3pJQ21bT5KfCpPHtJXZvR+evyeqNtNlHtS/3AhS30V3VSSvenlP4tpTRSV/8K8Pk8+56aRca8w+VYNfIvefq2mjrjXZaPUX2hv5Dqb24j0xW/0f3mk7X7ZErpUeCfqfa7c1v5pTRhxR/fJvdT7/Q8vbdBIrGd6tv7POAd090xTdh78/SeBsu+C+wCVkVEf4tt7q5bZzJtNHn78nSops6Yl+vsPH2yps54FyIillNdhvXZlNJ3x1h1yuMXEXOozubuAh4Yx/uoNf35voqrI+KyiDi9yfXzxR/fJvdT75fz9Kkmy5/O01+ahr7o0Gga05TSEPAc0Acc32Kbl6nOJh0TEfMA8n9ylgA78vJ67jdTICL6gA/n2doPZGNeiIi4KiKujYgbI+IB4K+oEvs1NasZ7wLk4/krVJfaXX2Q1acjfsuAXuDZvB+10katW0wV7+uAm6jubXw6It5dt17xx3ffVLyo9rMgTweaLB+tf8s09EWHxkRi2kqbw/J6uyb4Hpq8NcDbgbUppW/U1BvzclwFHF0zfw9wQUrptZo6412GvwBOBt6ZUho8yLrTET9jPnX+geq/If9DddP08VQ3wH4EuDsiTk0p/Xdet/jj2zP3kgRExMeAK6lGTDivzd3RFEkpLU4pBdVZvg9QJQGPR8SK9vZMh1JE/BbV2fobUkr/1e7+aGqllP4y30u1OaW0K6X0w5TSJVQDl8ylGjWna5jcT73Rb2cLmiwfrX99GvqiQ2MiMW21zUDd1P1mGkTEpcBngR8Bp6eUttWtYswLk5OAr1ENeLAI+HLNYuPdwfLlOF+muoTiz1tsNh3xM+bTb3SAhHfV1BV/fJvcT72f5Gmz66pGR2hodk2+Zp6mMc1/VI6juhnz2Rbb/DzVv/NeTCntAkgp7aQae/vwvLye+80hEhGXU415/kOqxL7RA0+MeaFSSs9Tfak7KSKOytXGu7MdThWH5cDu2gcaUY1SB/D3ue6mPD8d8XsGGAaOz/tRK200OaOX29WOSFj88W1yP/W+ladnRN1TLyNiPrCa6vqsh6e7Y5qw+/P0dxssexfV6EcPpZT2tNjmfXXrTKaNxiEi/pTqwSJPUCX2rzZZ1ZiX7a15Opynxruz7aF6MFGj8nhe58E8P3rJzpTHLw+1+BDV/nPaON5HEzc6EmFtol7+8T0Vg+dbDnhggg+x6qBCaw+xeo3xPQDjODroARjdUKj+XZ+A7wNHHmRdY97Bheps24IG9T28+RCrdca7/EJ17XWjh1hNS/xo7SFWR7R7O3VSofoPzWEN6pdSjUqTgKtr6os/vtselG4oVMNfbc5B/jrVo+7vz/M/ARa1u4/dXoDfB27P5Z4cm2dq6q5vsP7oo6u/CPwNNY+uBqLBe3yU8T+6+gYOfHT1Fnw0/WTjfX7ehkN5u17boFxgzMsowOXAIPCfwBfyZ/Bt+RhPwMvArxjv8gtNkvvpih/V03LvzMs35P3qS3k/GwLOafc26rSSY7od+A/gc8CngbvyMZ9y/ey6NkUf320PSrcU4FiqoZpeBvYCz1ONw7qw3X2z7PeB36xsatBmNbAW+Gn+EPkBcAXQO8b7nA18J38Q7QQeBc4/SN8uyOvtzO2+A5zV7m3WyaWFeCfg28a8jEI1vOktVJdfbcl/1AfyNr6WJv+5Md7lFcZI7qcrflTDkF+R96fBvH+tBVa1e/t0YgHeDfwTVXL+OtWDCF+j+jL/YRok6rldscd35DeWJEmS1OG8oVaSJEkqhMm9JEmSVAiTe0mSJKkQJveSJElSIUzuJUmSpEKY3EuSJEmFMLmXJEmSCmFyL0mSJBXC5F6SJEkqhMm9JEmSVAiTe0mSJKkQJveSJElSIUzuJUmSpEKY3EuSJEmFMLmXJEmSCmFyL0mSJBXC5F6SJEkqxP8DxynuMYQt2BsAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 263,
       "width": 379
      },
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"Convergence\")\n",
    "plt.plot(callback.n_evals, callback.opt, \"--\")\n",
    "plt.yscale(\"log\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
